// 1.初始化axios实例
// 2.请求拦截器，如果有token进行头部携带
// 3.响应拦截器：1.剥离无用数据 2.处理token失效 3.错误提示
// 4.导出一个函数，调用当前axios实例用来发送请求，返回promise


import axios, { Method } from "axios";
import router from '@/router'
import { MyAxiosPromise, MyAxiosRequestHeaders } from '../types/axiosTypes'
import store from "@/store";

// 定义基础地址时导出去，原因：可能其他地方不是通过axios发送请求也需要用到基础地址
export const baseURL = 'https://apipc-xiaotuxian-front.itheima.net/'
// export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const request = axios.create({
    baseURL,
    timeout: 5000,
})

// 请求拦截器
request.interceptors.request.use((config)=>{
    // 拦截的业务逻辑
    // 进行请求配置的修改
    // 如果本地有token就在头部携带
    // 1.获取用户信息对象
    const state = store.state
    const { user:{profile:{token}} } = state
    if(token) {
        (config.headers as MyAxiosRequestHeaders).Authorization = `Bearer ${token}`
    }
    return config
}, err => {
    return Promise.reject(err)
})

// 响应拦截器
// 没有出错则直接取出data返回，将来调用接口拿到的就直接是数据
request.interceptors.response.use<{result: any}>(res => res.data, err => {
    // 401 状态码，鉴权失败需要重新登录
    if (err.response && err.response.status === 401) {
      // 1. 清空无效用户信息
      // 2. 跳转到登录页
      // 3. 跳转需要传参（当前路由地址）给登录页码
      store.commit('user/setUser', {})
      // 当前路由地址作为参数，在登录成功后可以直接跳转
      // encodeURIComponent 转换uri编码，防止解析地址出问题
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      router.push('/login?redirectUrl=' + fullPath)
    }
    return Promise.reject(err)
  })

  export default (url: string, method: Method, submitData?: Object | string) => request({
    url,
    method,
    // 1. 如果是get请求  需要使用params来传递submitData
    // 2. 如果不是get请求  需要使用data来传递submitData
    // [] 设置一个动态的key, 写js表达式，js表达式的执行结果当作KEY
    // method参数：get,Get,GET  转换成小写再来判断
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  }) as MyAxiosPromise